package com.cssiot.weixin.basic.util;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 类名：QuartzUtil <br/>
 * 功能：处理定时任务调度队列<br/>
 * 详细：Quartz增、删、改工具类 <br/>
 * 作者： jacking<br/>
 * 日期：2016-12-18<br/>
 */
public class QuartzUtil {
 	public static final String DATA_KEY = "STATE_DATA";
    private static Logger log = LoggerFactory.getLogger(QuartzUtil.class);
    private Scheduler scheduler = null;
    private static  QuartzUtil quartzUtil= null;
    
    public synchronized static QuartzUtil getInstance(){
        if(quartzUtil == null){
            return new QuartzUtil();
        }
        return quartzUtil;
    } 
     
    private QuartzUtil (){
        try {
            scheduler = new StdSchedulerFactory().getScheduler();
            log.info("初始化调度器 ");
        } catch (SchedulerException ex) {
            log.error("初始化调度器=> [失败]:" + ex.getLocalizedMessage());
        }
    }  
    /**
     * 添加任务
     * @param name
     * @param group
     * @param clazz
     * @param cronExpression
     */
    public void addJob(String name, String group, Class<? extends Job> clazz,String cronExpression) {                 
        try {       
            //构造任务
            JobDetail job = newJob(clazz).withIdentity(name, group).build();
            //构造任务触发器
            Trigger trg = newTrigger() .withIdentity(name, group) 
            		.withSchedule(cronSchedule(cronExpression)) .build();       
            //将作业添加到调度器
            scheduler.scheduleJob(job, trg);
            log.info("创建作业=> [作业名称：" + name + " 作业组：" + group + "] ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("创建作业=> [作业名称：" + name + " 作业组：" + group + "]=> [失败]");
        }
    }
    /**
     * 删除任务
     * @param name
     * @param group
     */
    public void removeJob(String name, String group){
        try {
            TriggerKey tk = TriggerKey.triggerKey(name, group);
            scheduler.pauseTrigger(tk);//停止触发器  
            scheduler.unscheduleJob(tk);//移除触发器
            JobKey jobKey = JobKey.jobKey(name, group);
            scheduler.deleteJob(jobKey);//删除作业
            log.info("删除作业=> [作业名称：" + name + " 作业组：" + group + "] ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("删除作业=> [作业名称：" + name + " 作业组：" + group + "]=> [失败]");
        }
    }
    
    
    /**
     * 暂停任务
     * @param name
     * @param group
     */
    public void pauseJob(String name, String group){
        try {
            JobKey jobKey = JobKey.jobKey(name, group);
            scheduler.pauseJob(jobKey);
            log.info("暂停作业=> [作业名称：" + name + " 作业组：" + group + "] ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("暂停作业=> [作业名称：" + name + " 作业组：" + group + "]=> [失败]");
        }
    }
    /**
     * 恢复任务
     * @param name
     * @param group
     */
    public void resumeJob(String name, String group){
        try {
            JobKey jobKey = JobKey.jobKey(name, group);         
            scheduler.resumeJob(jobKey);
            log.info("恢复作业=> [作业名称：" + name + " 作业组：" + group + "] ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("恢复作业=> [作业名称：" + name + " 作业组：" + group + "]=> [失败]");
        }       
    }
  /**
   * 修改任务   
   * @param name
   * @param group
   * @param cronExpression
   */
    public void modifyTime(String name, String group, String cronExpression){       
        try {
            TriggerKey tk = TriggerKey.triggerKey(name, group);
            //构造任务触发器
            Trigger trg = newTrigger()
                    .withIdentity(name, group)
                    .withSchedule(cronSchedule(cronExpression))
                    .build();       
            scheduler.rescheduleJob(tk, trg);
            log.info("修改作业触发时间=> [作业名称：" + name + " 作业组：" + group + "] ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("修改作业触发时间=> [作业名称：" + name + " 作业组：" + group + "]=> [失败]");
        }
    }
	 /**
	  * 启动调度器
	  */
    public void start() {
        try {
            scheduler.start();
            log.info("启动调度器 ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("启动调度器=> [失败]");
        }
    }
  /**
   * 停止调度器
   */
    public void shutdown() {
        try {
            scheduler.shutdown();
            log.info("停止调度器 ");
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("停止调度器=> [失败]");
        }
    }
    
     
    /**
     * 立即运行定时任务 
     * @param name
     * @param group
     */
    public void runJob(String name, String group){  
        log.info("立即运行任务调度中的定时任务");  
        try {  
            if (null == name||null == group) {  
            	log.info("定时任务信息为空，无法立即运行");  
                return;  
            }  
            JobKey jobKey = JobKey.jobKey(name, group);  
            if(null == jobKey){  
            	log.info("任务调度中不存在[" + group + "]定时任务，不予立即运行！");  
                return;  
            }  
            scheduler.triggerJob(jobKey);  
        } catch (Exception e) {  
        	log.error("立即运行任务调度中的定时任务异常！" + e.getMessage(), e);  
        }  
    }  
    
  
}